#
#= プロジェクトコンポーネントモデル
#
#プロジェクト構成オブジェクト（タスク・マイルストーン・イベント）の追加・更新・削除後に
#ログを出力する。
#
#プロジェクト構成オブジェクトの種類はtask_kbnで識別する。
# task_kbn = 1 => タスク
# task_kbn = 2 => マイルストーン
# task_kbn = 3 => イベント
#

class DatProjectcomp < ActiveRecord::Base

  #########################
  # 関連定義
  #########################
  # プロジェクトデータに所有される(1:多)
  belongs_to :dat_project, :foreign_key => "project_id"
  # マイルストーンデータを所有する(1:1)
  has_one :dat_milestone, :foreign_key => "project_tree_id", :dependent=>:destroy
  # タスクデータを所有する(1:1)
  has_one :dat_task, :foreign_key => "project_tree_id", :dependent=>:destroy
  # イベントデータを所有する(1:1)
  has_one :dat_event, :foreign_key => "project_tree_id", :dependent=>:destroy
  # プロジェクトログデータを所有する(1:多)
  has_many :dat_projectlogs, :foreign_key => "projectcomp_id"

  # ユーザーマスタに所有される(1:多)
  belongs_to :mst_user_create, :class_name=>"MstUser", :foreign_key=>"create_user_id"
  # ユーザーマスタに所有される(1:多)
  belongs_to :mst_user_update, :class_name=>"MstUser", :foreign_key=>"update_user_id"

  #########################
  # 検証機能定義
  # （全てのインスタンスで共通の検査項目は、クラスメソッドで定義）
  # （:messageの指定は、言語DBのエラーメッセージ区分に登録されているmsg_cdを指定）
  #########################
  # 未入力検証
  validates_presence_of :item_name, :message=>:cant_be_empty
  # 範囲内検証
  validates_inclusion_of :task_kbn, :in=>[1,2,3], :message=>:in_not_included
  # 数値検証
  validates_numericality_of :line_no, :allow_nil=>true, :only_integer=>true, :message=>:not_numeric
  # 文字数検証
  validates_length_of :item_name, :maximum=>255, :too_long=>"too_long,%d"
  validates_length_of :class_word1, :maximum=>255, :too_long=>"too_long,%d", :allow_nil=>true
  validates_length_of :class_word2, :maximum=>255, :too_long=>"too_long,%d", :allow_nil=>true
  validates_length_of :class_word3, :maximum=>255, :too_long=>"too_long,%d", :allow_nil=>true
  # その他


  #
  #=== 検証エラーを記録する
  #
  #プロジェクト構成オブジェクトの種類（タスク・マイルストーン・イベント）に応じて
  #検証エラーを記録する。
  #
  def validate_on_create
    case task_kbn
    when 1
      errors.add(:dat_task, :associated_invalid) unless dat_task.valid?
    when 2
      errors.add(:dat_milestone, :associated_invalid) unless dat_milestone.valid?
    when 3
      errors.add(:dat_event, :associated_invalid) unless dat_event.valid?
    end
  end


  #
  #=== テンプレートデータから属性値をコピーする
  #
  #指定されたテンプレートデータ(テンプレート構成マスタ）から
  #タスク・マイルストーン・イベントの属性値をコピーする。
  #
  def copyFromTemplate(template)
    self.attributes.each_pair do | key, value |
      case key.to_s
      when "create_user_id"
      when "created_on"
      when "update_user_id"
      when "updated_on"
      else
        if ! template[key.to_s].nil?
          self[key.to_s] = template[key.to_s]
        end
      end
    end

    if ! template.mst_tptask.nil?
      task = DatTask.new
      task.create_user_id = self.create_user_id
      task.update_user_id = self.update_user_id
      task.last_operation_kbn = 1
      task.copyFromTemplate(template.mst_tptask)
      self.dat_task = task 
    end

    if ! template.mst_tpmilestone.nil?
      milestone = DatMilestone.new
      milestone.create_user_id = self.create_user_id
      milestone.update_user_id = self.update_user_id
      milestone.last_operation_kbn = 1
      milestone.copyFromTemplate(template.mst_tpmilestone)
      self.dat_milestone = milestone 
    end

    if ! template.mst_tpevent.nil?
      event = DatEvent.new
      event.create_user_id = self.create_user_id
      event.update_user_id = self.update_user_id
      event.last_operation_kbn = 1
      event.copyFromTemplate(template.mst_tpevent)
      self.dat_event = event 
    end

  end


  #
  #=== プロジェクト構成オブジェクト新規作成後処理
  #
  #新規プロジェクト構成オブジェクトが追加された旨のプロジェクトのログを生成する。
  #
  def after_create
    projectlog = self.dat_projectlogs.build
    projectlog.log_kbn = 1
    projectlog.create_user_id = self.create_user_id
    projectlog.save
  end


  #
  #=== プロジェクト構成オブジェクト更新後処理
  #
  #プロジェクト構成オブジェクトが更新された旨のプロジェクトのログを生成する。
  #
  def after_update
    projectlog = self.dat_projectlogs.build
    projectlog.log_kbn = 2
    projectlog.create_user_id = self.create_user_id
    projectlog.save
  end


  #
  #=== プロジェクト構成オブジェクト削除後処理
  #
  #プロジェクト構成オブジェクトが削除された旨のプロジェクトのログを生成する。
  #
  def after_destroy
    projectlog = self.dat_projectlogs.build
    projectlog.log_kbn = 3
    projectlog.create_user_id = self.create_user_id
    projectlog.save
  end


  #
  #=== プロジェクト構成情報取得処理
  #
  #登録済みプロジェクト構成情報を取得
  #※プロジェクト、マイルストーン情報も同時に取得
  #
  def self.find_milestone(id)
    opt = {
      :conditions => [" dat_projectcomps.id = ? ", id],
      :include    => :dat_milestone
    }
    find(:first, opt)
  end

end
